<?php
namespace app\command;


use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\Db; // 数据库的链接

class Football extends Command
{
    protected function configure()
    {
        $this->setName('Football')->setDescription('Here is the remark ');
        // 执行updateStatus
       
        $this->setName('Football')->addArgument('test')->setDescription('Here is the remark ');
        // bonus
        // $this->setName('test')->setDescription('Here is the remark ');

 
        // php think Timedtasks rankingList 排行榜 正式上线设置   0:1分
        // php think Timedtasks bonus 团队分红 正式上线设置 0:5分
    }
    protected function execute(Input $input, Output $output)
    {
        
        switch ($input->getArgument('test')) {
            case 'ballincome':
                self::ballincome($input, $output);
                break;
            default:
                self::clock($input, $output);
                break;
        }
    }

    /**
     * 打卡
     * 分给已打卡的用户奖励
     */

    protected static function clock(Input $input, Output $output)
    {
        // 昨日打卡时间
        $yesterday = date('Y-m-d', strtotime('-1 day'));
        // 使用tp6的时间查询 昨天的数据
        $yesterdayStart = strtotime("yesterday");
        $yesterdayEnd = strtotime("tomorrow") - 1;

        $where[] = ['is_state','=',0];

        $users = Db::name('user_clock')->where($where)->whereBetween('addto_time', [$yesterdayStart, $yesterdayEnd])->select()->toArray();
        
        if (!$users) {
            echo $yesterday."-无报名用户"."\n";
            return;
        }

        // $users长度 是参与报名的总人数
        $count = count($users);

        // 打卡总人数
        $clock_yes = Db::name('user_clock')->whereBetween('addto_time', [$yesterdayStart, $yesterdayEnd])->where('is_clock',1)->where($where)->select()->toArray();
        $clock_yes_count = count($clock_yes);
        // 未打卡总人数
        $clock_no = Db::name('user_clock')->whereBetween('addto_time', [$yesterdayStart, $yesterdayEnd])->where('is_clock',0)->where($where)->select()->toArray();
        $clock_no_count = count($clock_no);

        // 打卡总人数为0 全部扣掉奖励
        if($clock_yes_count == 0){
            // 全部扣掉
            foreach ($users as $key => $value) {
                Db::name('user_clock')->where('id', $value['id'])->update(['is_state' => 1]);
            }
            echo $yesterday."-今日无打卡用户"."\n";
            return;
        }
        // 未打卡总人数为0 奖励全部返还
        if($clock_no_count == 0){
            // 奖励全部返还
            foreach ($users as $key => $value) {
                Db::name('user_clock')->where('id', $value['id'])->update(['is_state' => 1]);
                self::userRecord($value['uid'], $value['gold'],1,0,'已签打卡奖励返还');
            }
            echo $yesterday ."-今日用户全部打卡"."\n";
            return;
        }else{
            // 统计未打卡用户的总金额
            $total_amount = 0;
            foreach ($clock_no as $key => $value) {
                $total_amount += $value['gold'];
            }
            
            // 获取设置的奖励比例
            $config = getSetting('config');
            $clock_yes_ratio = $config['destroy_ratio']; // 这里是后台设置的销毁比例 剩下的都是奖励比例
            
            // 算出销毁后的剩余金额
            $clock_yes_amount = round($total_amount * $clock_yes_ratio / 100, 2);
            // 每个用户可分多少佣金
            $clock_no_amount = round($total_amount / $clock_yes_count,2);
            // 给打开用户分用户奖励
            foreach ($clock_yes as $key => $value) {
                Db::name('user_clock')->where('id', $value['id'])->update(['is_state' => 1]);
                self::userRecord($value['uid'], $value['gold'],1,0,'已签打卡奖励返还');
                self::userRecord($value['uid'], $clock_no_amount,1,0,'打卡奖励发放');
            }

            echo $yesterday ."-参与分奖励人数:".$clock_yes_count."人,未打卡人数:".$clock_no_count."人,总奖励金额:".$clock_yes_amount."元,未打卡奖励金额:".$clock_no_amount."元"."\n";
            return;
        }
    }

    // 足球的收益 income 银牌
    protected static function ballincome(Input $input, Output $output)
    {
        
        // 查询收益时间小于今日的数据
        $today = date('Y-m-d');
        $where = ['recent_income_time' => ['lt', $today]];
        

        Db::name('ball_user')->where('is_status', 0)->where($where)->chunk(50, function($balluser) {
            foreach ($balluser as $key => $value) {
                // 查询对应的足球 得到收益
                $ball = Db::name('ball_type')->field('id,name,income,duration')->where('id', $value['bid'])->find();

                // 判断收益次数是否小于可收益时长
                if($value['frequency'] == $ball['duration']){
                    continue;
                }

                // 自己收益
                self::userRecord($value['uid'], $ball['income'],0,0,'足球'.$ball['name'].'收益发放');

                // 团队收益
                self::getMiningProfitByParent($value['uid'], $ball['income'], 0, '足球'.$ball['name'].'收益发放');

                // 更新足球的数据

                $data = [
                    'frequency' => $value['frequency'] + 1,
                    'today_income' => $ball['income'],
                    'total_revenue' => $value['total_revenue'] + $ball['income'],
                    'recent_income_time' => time()
                ];
                Db::name('ball_user')->where('id', $value['id'])->update($data);
            }
            return true; // 返回true将停止处理并结束分批操作
        });

        echo $today."足球收益发放成功---银牌收益"."\n";
    }
    /**
 * 资金操作记录到user_record表 5个参数 如果有bug 请同时修改common中的方法
 * @param int $uid 用户id
 * @param string $amount 金额数量
 * @param string $recharge_type 类型 0 银牌 1 金牌
 * @param string $operation_type 操作类型 0 充值 1扣除
 * @param string $remarks 描述
 * @return bool
 */
protected static function userRecord($uid, $amount,$recharge_type, $operation_type,  $remarks)
{

    $user = Db::name('user')->where('id', $uid)->find();
    if (!$user) {
        return array('code' => 500,'msg' => '用户不存在');
    }
    $type = 'silver'; // 默认银牌
    if($recharge_type == 1){
        $type = 'gold'; // 金牌
    }

    if ($operation_type == 0) {
        $new_amount = bcadd($user[$type], $amount, 2);
    } else {
        if($user[$type] < $amount){
            return array('code' => 500,'msg' => '余额不足');
        }
        $new_amount = bcsub($user[$type], $amount, 2);
    }
   
        // 开启事务操作
        Db::startTrans();
        try {
            $data = [
                'uid' => $uid,
                'order_sn' => ordersn("FD"),
                'recharge_type' => $recharge_type,
                'operation_type' => $operation_type,
                'ago_amount' => $user[$type],
                'after_amount' => $new_amount,
                'amount' => $amount,
                'remarks' => $remarks,
                'addto_time' => time(),
            ];
            Db::name('user_record')->insert($data);
            Db::name('user')->where('id', $uid)->update([$type => $new_amount]);
            // 提交事务
            Db::commit();
            return array('code' => 200,'msg' => '资金操作成功');
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            return array('code' => 500,'msg' => '操作失败');
        }
    }

/**
 * 上级分销 4个参数 如果有bug 请同时修改common中的方法
 * @param $uid  当前用户id
 * @param $profit  奖励金牌数
 * @param $type  奖励类型 0银牌 1金牌
 * @param $text  奖励描述
 * @return void
 */
 protected static function getMiningProfitByParent($uid,$profit,$type,$text = '足球收益发放')
{

    // 查询上级
    $sid = Db::name('user')->where('id',$uid)->value('sid');
    
    if(!$sid || $sid == 0){
        return;
    }
    
    $i = 1;// uid用户的第几个上级

    // 获取配置信息
    $config = getSetting('config');
    $tuan = $config['tuan']; // 团队奖励比例
    
    $k = 0;

    do {
        // 查询上级的上级
        $parent = Db::name('user')->where('id', $sid)->find();
        // // $i < 2 是直推 和 间推
        if($i <= 2){
            if($i == 1){
                // 给直推上级分佣 direct
                // 计算直推奖励 保留2位小数
                $direct_profit = round($profit * $config['direct'] / 100, 2);
                // 给直推上级分佣
                self::userRecord($parent['id'], $direct_profit, $type, 0, '直推奖励:'. $text. ',来自用户ID:'. $uid."收益百分百:". $config['direct']."%");
            }else{
                // 给间推上级分佣 indirect
                // 计算间推奖励 保留2位小数
                $indirect_profit = round($profit * $config['indirect'] / 100, 2);
                // 给间推上级分佣
                self::userRecord($parent['id'], $indirect_profit, $type, 0, '间推奖励:'.$text.',来自用户ID:'. $uid."收益百分百:". $config['indirect']."%");
            }
        }else{
            // ================== 2级以外的分销 =========================== 最高10级
            // 判断是否为0撸用户 查询闪卡使用中并且未到期 0撸用户不参3代以为的分销
            // 查询用户的闪卡情况
            $flash_card = Db::name('user_card_record')->where('uid', $uid)->where('is_status', 1)->where('del', '=', 0)->find();
            // $flash_card = 1;测试使用
            // 闪卡存在并且未到期
            if($flash_card){
                // 在查看用户的足球数量
                $football = Db::name('ball_user')->where('uid', $uid)->where('is_status', 0)->count();
                // $football = $parent['football']; // 测试使用
                /**
                 * 由于业务逻辑特殊 5级 和 9级 的足球数量需要加 1
                 */
                $football_num = 0;
                if($i == 6 || $i == 10){
                    $football_num = 1;
                }
                 // 3,4,6,7,8,10级 足球数量条件不加 1
                if($football >= $tuan[$k - $football_num]['generation']){
                    // 计算奖励 保留2位小数
                    $generation_profit = round($profit * $tuan[$k - $football_num]['ratio'] / 100, 2);
                    // 给上级分佣
                    self::userRecord($parent['id'], $generation_profit, 1, 0, '第'. $i . '代奖励:'. $text. ',来自用户ID:'. $uid."收益百分百:". $tuan[$k - $football_num]['ratio']."%");
                }
                if($football_num == 0){
                    $k++;
                }
            }
        }

        // 给sid 分配最新上级
        $i++;
        $sid = $parent['sid'];
    }while($sid > 0 && $i < 11); // 最高10级 $i小于11 就是10级
}

}